/*智能指针 box, 数据存放在堆上，栈上存放指向堆的指针
Box<T>，单一拥有者，可变或不可变借用，编译时检查(Deref, DerefMut)
*/
use std::ops::Deref;
use std::mem;
#[test]
pub fn box_demo() {
    let mut b = Box::new(5);
    println!("{}", *b);
    println!("{}", b);
    *b = 34;
    println!("{}", b);
}
/*链表节点*/
enum  Node{
    DATA(i32, Box<Node>),
    Nil,
}



pub fn box_demo2(){

    let head = Node::DATA(1,
                          Box::new(Node::DATA(2,
                                              Box::new(Node::DATA(3,
                                                                  Box::new(Node::Nil))))));
    let mut ref_head = &head;
    loop{
        match ref_head {
            Node::DATA(v, next) =>{
                println!("{}", v);
                ref_head = next; //编译器自动将Box引用转为Node引用
            },
            Node::Nil =>{
                break
            }
        }
    }

}

/*使用元组结构体 自定义Box*/
struct MyBox<T>(T);

impl <T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}
//实现Deref(解引用)这个trait, 实现后就可以 使用*解引用
impl <T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &T {
        &self.0
    }
}
#[test]
pub fn box_demo3(){
    let x = 23;
    let mybox = MyBox::new(x);
    println!("{}", *mybox); //MyBox实现了Deref可以使用*解引用
    println!("{}", x == *mybox); //true
}

